package com.tina.controller;


import com.tina.entity.Common;
import com.tina.service.ICommonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 评论前端控制器
 * </p>
 *
 * @author Tina
 * @since 2020-10-26
 */
@RestController
@RequestMapping("/common/")
public class CommonController {

    @Autowired
    private ICommonService commonService;

    @GetMapping("list/{flowersId}")
    public List<Common> list(@PathVariable("flowersId") Long flowersId) {

        List<Common> commons = commonService.selectCommon(flowersId);

        return findParent(commons);
    }


    /**
     * 处理每个父级评论的子级及其嵌套子级
     *
     * @param comments
     * @return
     */
    public List<Common> findParent(List<Common> comments) {

        for (Common comment : comments) {

            // 防止checkForComodification(),而建立一个新集合
            ArrayList<Common> fatherChildren = new ArrayList<>();

            // 递归处理子级的回复，即回复内有回复
            findChildren(comment, fatherChildren);

            // 将递归处理后的集合放回父级的孩子中
            comment.setChildren(fatherChildren);
        }
        return comments;
    }

    public void findChildren(Common parent, List<Common> fatherChildren) {

        // 找出直接子级
        List<Common> comments = parent.getChildren();

        // 遍历直接子级的子级
        for (Common comment : comments) {

            // 若非空，则还有子级，递归
            if (!comment.getChildren().isEmpty()) {
                findChildren(comment, fatherChildren);
            }

            // 已经到了最底层的嵌套关系，将该回复放入新建立的集合
            fatherChildren.add(comment);

            // 容易忽略的地方：将相对底层的子级放入新建立的集合之后
            // 则表示解除了嵌套关系，对应的其父级的子级应该设为空
            comment.setChildren(new ArrayList<>());
        }
    }


}
